from LAC import LAC
#https://github.com/baidu/lac
#效果比腾讯好，且在本地运行，很好用。模型很重要的是泛化性，不需要任何训练可以直接用。如果要训练面向某一领域的各类模型，需要自己喂大量数据。
#NER的实体到底如何定义呢?我们假如用甲状腺肿瘤的文本，那么甲状腺肿瘤毫无疑问是个实体，但是LTP不会将其算实体，LAC似乎也只认为有下述四种大写标出的实体，NER该怎么做？

'''
n	普通名词	f	方位名词	s	处所名词	nw	    作品名
nz	其他专名	v	普通动词	vd	动副词	vn	    名动词
a	形容词	ad	副形词	an	名形词	d	    副词
m	数量词	q	量词	    r	代词  	p	    介词
c	连词	    u	助词	    xc	其他虚词	w	    标点符号
PER 人名	    LOC	地名	    ORG	机构名	TIME	时间
'''
#拼合词与其词性,展示
def show_result(lac_result):
    words = lac_result[0]
    tag = lac_result[1]
    for i in range(len(words)):
        print(words[i]+' : '+tag[i])

#选择词性为名词的词返回
def select_noun(lac_result):
    noun_list = ['n','nz','PER','f','LOC','s','an','ORG','nw','vn']
    words = lac_result[0]
    tag = lac_result[1]
    newwords = []
    newtag = []
    for i in range(len(words)):
        if tag[i] in noun_list:
            newwords.append(words[i])
            newtag.append(tag[i])
    print(newwords)
    return (newwords,newtag)

#选择词性属于自定义列表的词返回
def select_myrange(lac_result,myrange):

    words = lac_result[0]
    tag = lac_result[1]
    newwords = []
    newtag = []
    for i in range(len(words)):
        if tag[i] in myrange:
            newwords.append(words[i])
            newtag.append(tag[i])
    # print(newwords)
    return (newwords,newtag)

# #第一个参数为lac对象，为优化运行速度，由调用时传入。
# def lac_run(lac,sentence):
#     # lac = LAC(mode='lac')
#     lac_result = lac.run(sentence)
#     return lac_result

if __name__ == '__main__':
    sentence = '甲状腺结节是内分泌系统的多发病和常见病。触诊获得的甲状腺结节患病率为3％～7％．高分辨率B超检查获得的甲状腺结节的患病率为20％～7' \
               '6％。甲状腺结节中的甲状腺癌的患病率为5％～15％。近年来我国甲状腺癌的发病率呈现增高的趋势，非必要的甲状腺结节的手术率也显著升高' \
               '。甲状腺癌的术式、放射性碘治疗、TSH抑制疗法和甲状腺癌复发的监测等方面都缺乏共识和规范。甲状腺结节和甲状腺癌的诊断和治疗涉及内分泌' \
               '学、头颈外科学、普通外科学、核医学等多个临床学科，是一个典型的跨学科疾病。为了规范我国甲状腺结节和甲状腺癌的诊断和治疗，提高临床治愈' \
               '率，2011年4月，中华医学会内分泌学分会、中华医学会普通外科学分会、中国抗癌协会头颈肿瘤专业委员会、中华医学会核医学分会决定联合编撰' \
               '我国首部《甲状腺结节和分化型甲状腺癌诊治指南》。编撰工作历时一年．四个学会共56位专家参加了编写和审阅工作。编写委员会本着“立足国情' \
               '、循证为本、求新求实、趋同存异”的原则，认真总结了我国甲状腺结节和分化型甲状腺癌诊断治疗的实践经验．充分汲取国际多个指南和国内各个学' \
               '科现有指南的精华，编撰了这部目前四个学科都能够接受和认可的《指南》。本指南包括甲状腺结节和分化型甲状腺癌(DTC)两个章节，采取问题条' \
               '款和推荐条款并进的模式．共计54项问题条款．72项推荐条款。推荐条款标示推荐强度。内容包括甲状腺结节的良恶性鉴别、细针穿刺活检(FNAB)结' \
               '果判定、甲状腺结节手术治疗的适应证；DTC甲状腺手术术式的选择和颈部淋巴结的处理、TNM分期和复发风险评估、”1碘清甲治疗的适应证和具体方' \
               '法、DTC转移的”1碘清灶疗法、DTC的TSH抑制疗法、DTC复发的血清取浓度的监测等。编写委员会以2009年美国甲状腺学会(ATA)的《甲状腺结节和' \
               '分化型甲状腺癌诊治指南》为蓝本，参考了2010年欧洲肿瘤内科学会(ESMO)《甲状腺癌诊治和随访指南》和2010年美国临床内分泌医师协会(AACE)' \
               '／意大利临床内分泌医师协会(AME)／欧洲甲状腺学会(ETA)《甲状腺结节诊治指南》等权威文献，采用了这些指南提供的丰富的循证医学证据。使得' \
               '本《指南》能够反映本领域的最新进展和普遍共识。根据甲状腺结节和分化型甲状腺癌基础和临床领域的进展情况．我们将适时修订本指南。'
    # 条件复句
    sentence = '当事人一方不履行合同义务或者履行合同义务不符合约定，造成对方损失的，损失赔偿额应当相当于因违约' \
               '所造成的损失，包括合同履行后可以获得的利益。'

    # 转折嵌套条件(条件含于转折)
    sentence = '当事人一方不履行合同义务或者履行合同义务不符合约定，造成对方损失的，损失赔偿额应当相当于因违约所造成的损失，包括合同履行后可以获得的利益；' \
               '但是，不得超过违约一方订立合同时预见到或者应当预见到的因违约可能造成的损失。'
    # 假设复句
    sentence = '买受人如果就其中一批标的物解除，该批标的物与其他各批标的物相互依存的，可以就已经交付和未交付的各批标的物解除。'

    '''
    一些关键触发词及LAC给出的词性
    c连词:如果,但是
    u助词:的
    d副词
    p介词
    xc其他虚词
    '''

    lac = LAC(mode='lac')
    lac_result = lac.run(sentence)#每个句子的输出其切词结果word_list以及对每个单词的标注tags_list，其格式为（word_list, tags_list)
    print(lac_result)
    show_result(lac_result)
    # show_result(select_noun(lac_result))    #仅显示名词实体结果